﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HslCommunication.ModBus;
using HslCommunication;
using 进窑工位采集服务.common;
using System.Threading;

namespace 进窑工位采集服务.ModBus
{
    public class Hsl_ModBusTCPIP
    {
        private static Hsl_ModBusTCPIP uniqueInstance;

        ModbusTcpNet busTcpClient;   // 端口号502，站号1
        string ip;

        // 定义一个标识确保线程同步
        private static readonly object locker = new object();

        // 定义私有构造函数，使外界不能创建该类实例
        private Hsl_ModBusTCPIP(string IP)
        {
            busTcpClient = new ModbusTcpNet(IP);   // 端口号502，站号1

            ip = IP;

            busTcpClient.ConnectServer();

        }

        /// <summary>
        /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
        /// </summary>
        /// <returns></returns>
        public static Hsl_ModBusTCPIP GetInstance(string IP)
        {
            // 当第一个线程运行到这里时，此时会对locker对象 "加锁"，
            // 当第二个线程运行该方法时，首先检测到locker对象为"加锁"状态，该线程就会挂起等待第一个线程解锁
            // lock语句运行完之后（即线程运行完之后）会对该对象"解锁"
            // 双重锁定只需要一句判断就可以了
            if (uniqueInstance == null)
            {
                lock (locker)
                {
                    // 如果类的实例不存在则创建，否则直接返回
                    if (uniqueInstance == null)
                    {
                        uniqueInstance = new Hsl_ModBusTCPIP(IP);
                    }
                }
            }
            return uniqueInstance;
        }

        public string Read()
        {
            byte[] data = HslCommunication.BasicFramework.SoftBasic.HexStringToBytes("00 00 00 00 00 06 01 02 00 00 00 08");

            HslCommunication.OperateResult<byte[]> read = busTcpClient.ReadFromCoreServer(data);

            if (read.IsSuccess)
            {
                // 获取结果，并转化为Hex字符串，方便显示
                //string result = HslCommunication.BasicFramework.SoftBasic.ByteToHexString(read.Content, ' ');

                byte[] responseHeader = read.Content;


                return responseHeader[9].ToString();

            }
            else
            {
                #region 错误日记
                LogManager.LogInfo("读取工控机状态", "怎么会是空呢？");
                #endregion

                Thread.Sleep(200);

                return "";

            }

        }
    }
}
